import {FormTypes, getListData} from '@/utils/JEditableTableUtil'
import {
  findBySelectCus,
  findBySelectRetail,
  findBySelectSup,
  findStockByDepotAndBarCode,
  getAccount,
  getBatchNumberList,
  getCurrentSystemConfig,
  getMaterialByBarCode,
  getPersonByNumType,
  getPlatformConfigByKey
} from '@/api/api'
import {getAction} from '@/api/manage'
import {getCheckFlag, getMpListShort, getNowFormatDateTime} from '@/utils/util'
import {USER_INFO} from '@/store/mutation-types'
import Vue from 'vue'
import i18n from '@/locales/i18n'

export const BillModalMixin = {
  data() {
    return {
      action: '',
      manyAccountBtnStatus: false,
      supList: [],
      cusList: [],
      retailList: [],
      personList: {
        options: [],
        value: ''
      },
      payTypeList: {
        options: [],
        value: ''
      },
      currentSelectDepotId: '',
      depotList: [],
      accountList: [],
      accountIdList: [],
      accountMoneyList: [],
      billUnitPirce: '',
      scanBarCode: '',
      scanStatus: true,
      billStatus: 0,
      minWidth: 1100,
      isCanCheck: true,
      isTenant: false,
      billPrintFlag: false,
      /* 原始审核是否开启 */
      checkFlag: true,
      validatorRules: {
        price: {
          rules: [
            {
              pattern: /^(([0-9][0-9]*)|([0]\.\d{0,4}|[0-9][0-9]*\.\d{0,4}))$/,
              message: i18n.t('message.amountFormatIsIncorrect')
            }
          ]
        }
      },
      spans: {
        labelCol1: {span: 2},
        wrapperCol1: {span: 22},
        //1_5: 分为1.5列（相当于占了2/3）
        labelCol1_5: { span: 3 },
        wrapperCol1_5: { span: 21 },
        labelCol2: {span: 4},
        wrapperCol2: {span: 20},
        labelCol3: {span: 6},
        wrapperCol3: {span: 18},
        labelCol6: {span: 12},
        wrapperCol6: {span: 12}
      }
    }
  },
  created () {
    let userInfo = Vue.ls.get(USER_INFO)
    this.isTenant = userInfo.id === userInfo.tenantId ? true : false
    let realScreenWidth = window.screen.width
    this.width = realScreenWidth < 1500 ? '1200px' : '1550px'
    this.minWidth = realScreenWidth < 1500 ? 1150 : 1500
  },
  computed: {
    readOnly: function () {
      return this.action !== 'add' && this.action !== 'edit'
    }
  },
  methods: {
    addInit(amountNum) {
      getAction('/sequence/buildNumber').then((res) => {
        if (res && res.code === 200) {
          this.model.defaultNumber = amountNum + res.data.defaultNumber
          this.form.setFieldsValue({'number': amountNum + res.data.defaultNumber})
        }
      })
      this.$nextTick(() => {
        this.form.setFieldsValue({
          'operTime': getNowFormatDateTime(), 'discount': 0,
          'discountMoney': 0, 'discountLastMoney': 0, 'otherMoney': 0, 'changeAmount': 0, 'debt': 0
        })
      })
      this.$nextTick(() => {
        getAccount({}).then((res) => {
          if (res && res.code === 200) {
            for (const item of res.data.accountList) {
              if (item.isDefault) {
                this.form.setFieldsValue({'accountId': item.id})
              }
            }
          }
        })
      })
      this.accountIdList = []
      this.accountMoneyList = []
      this.manyAccountBtnStatus = false
    },
    copyAddInit(amountNum) {
      getAction('/sequence/buildNumber').then((res) => {
        if (res && res.code === 200) {
          this.form.setFieldsValue({'number': amountNum + res.data.defaultNumber})
        }
      })
      this.$nextTick(() => {
        this.form.setFieldsValue({'operTime': getNowFormatDateTime()})
      })
    },
    /** 查询某个tab的数据 */
    requestSubTableData(url, params, tab, success) {
      tab.loading = true
      getAction(url, params).then(res => {
        if (res && res.code === 200) {
          tab.dataSource = res.data.rows
          for (let i = 0; i < tab.dataSource.length; i++) {
            let info = tab.dataSource[i]
            this.changeColumnShow(info)
          }
          typeof success === 'function' ? success(res) : ''
        }
      }).finally(() => {
        tab.loading = false
      })
    },
    //改变字段的状态，1-显示 0-隐藏
    changeFormTypes(columns, key, type) {
      for (let i = 0; i < columns.length; i++) {
        if (columns[i].key === key) {
          if (type) {
            if (key === 'snList' || key === 'batchNumber') {
              if (this.prefixNo === 'LSCK' || this.prefixNo === 'CGTH' || this.prefixNo === 'DB' || this.prefixNo === 'QTCK' || this.prefixNo === 'DBCK') {
                columns[i].type = FormTypes.popupJsh //显示
              } else {
                if (key === 'snList') {
                  columns[i].type = FormTypes.popupJsh //显示
                } else {
                  columns[i].type = FormTypes.input //显示
                }
              }
            } else if (key === 'expirationDate') {
              if (this.prefixNo === 'LSTH' || this.prefixNo === 'CGRK' || this.prefixNo === 'XSTH' || this.prefixNo === 'QTRK') {
                columns[i].type = FormTypes.date //显示
              } else {
                columns[i].type = FormTypes.input //显示
              }
            } else {
              columns[i].type = FormTypes.normal //显示
            }
          } else {
            columns[i].type = FormTypes.hidden //隐藏
          }
        }
      }
    },
    initSystemConfig() {
      getCurrentSystemConfig().then((res) => {
        if (res.code === 200 && res.data) {
          let multiBillType = res.data.multiBillType
          let multiLevelApprovalFlag = res.data.multiLevelApprovalFlag
          this.checkFlag = getCheckFlag(multiBillType, multiLevelApprovalFlag, this.prefixNo)
          this.purchaseBySaleFlag = res.data.purchaseBySaleFlag === '1' ? true : false
          this.inOutManageFlag = res.data.inOutManageFlag === '1' ? true : false
        }
      })
    },
    initSupplier(isChecked) {
      let that = this
      findBySelectSup({}).then((res) => {
        if (res) {
          that.supList = res
          if (isChecked && res.length > 0) {
            that.form.setFieldsValue({'organId': res[0].id})
          }
        }
      })
    },
    initCustomer(isChecked) {
      let that = this
      findBySelectCus({}).then((res) => {
        if (res) {
          that.cusList = res
          if (isChecked && res.length > 0) {
            that.form.setFieldsValue({'organId': res[0].id})
          }
        }
      })
    },
    initRetail(isChecked) {
      let that = this
      findBySelectRetail({}).then((res) => {
        if (res) {
          that.retailList = res
          if (isChecked && res.length > 0) {
            that.form.setFieldsValue({'organId': res[0].id})
          }
        }
      })
    },
    initSalesman() {
      let that = this
      getPersonByNumType({type: 1}).then((res) => {
        if (res) {
          that.personList.options = res
        }
      })
    },
    initDepot() {
      let that = this
      getAction('/depot/findDepotByCurrentUser').then((res) => {
        if (res.code === 200) {
          let arr = res.data
          for (let item of that.materialTable.columns) {
            if (item.key == 'depotId' || item.key == 'anotherDepotId') {
              item.options = []
              for (let i = 0; i < arr.length; i++) {
                let depotInfo = {}
                depotInfo.value = arr[i].id + '' //注意-此处value必须为字符串格式
                depotInfo.text = arr[i].depotName
                depotInfo.title = arr[i].depotName
                item.options.push(depotInfo)
              }
            }
          }
        }
      })
    },
    initAccount(isChecked) {
      let that = this
      getAccount({}).then((res) => {
        if (res && res.code === 200) {
          let list = res.data.accountList
          let lastId = list.length > 0 ? list[0].id : ''
          getCurrentSystemConfig().then((res) => {
            if (res.code === 200 && res.data) {
              let multiAccountFlag = res.data.multiAccountFlag
              if (multiAccountFlag === '1') {
                list.splice(0, 0, {id: 0, name: '多账户'})
              }
            }
            that.accountList = list
            if (isChecked) {
              that.form.setFieldsValue({'accountId': lastId})
            }
          })
        }
      })
    },
    handleManyAccount() {
      this.selectAccount(0)
    },
    selectAccount(value) {
      if (value === 0) { //多账户
        this.$refs.manyAccountModalForm.edit(this.accountIdList, this.accountMoneyList)
        this.$refs.manyAccountModalForm.title = i18n.t('title.manyAccount')
        this.manyAccountBtnStatus = true
      } else {
        this.accountIdList = []
        this.accountMoneyList = []
        this.manyAccountBtnStatus = false
      }
    },
    manyAccountModalFormOk(idList, moneyList, allPrice) {
      this.accountIdList = idList
      this.accountMoneyList = moneyList
      let discountLastMoney = this.form.getFieldValue('discountLastMoney') - 0
      let otherMoney = this.form.getFieldValue('otherMoney') ? this.form.getFieldValue('otherMoney') - 0 : 0
      let debt = (discountLastMoney + otherMoney - allPrice).toFixed(2)
      this.$nextTick(() => {
        this.form.setFieldsValue({'changeAmount': allPrice, 'debt': debt})
      })
    },
    addSupplier() {
      this.$refs.vendorModalForm.add()
      this.$refs.vendorModalForm.title = i18n.t('title.addSupplier')
      this.$refs.vendorModalForm.disableSubmit = false
    },
    addCustomer() {
      this.$refs.customerModalForm.add()
      this.$refs.customerModalForm.title = i18n.t('title.addCustomer')
      this.$refs.customerModalForm.disableSubmit = false
    },
    addMember() {
      this.$refs.memberModalForm.add()
      this.$refs.memberModalForm.title = i18n.t('title.addMember')
      this.$refs.memberModalForm.disableSubmit = false
    },
    handleBatchSetDepot() {
      this.$refs.batchSetDepotModalForm.add()
      this.$refs.batchSetDepotModalForm.title = i18n.t('title.batchSetDepot')
      this.$refs.batchSetDepotModalForm.disableSubmit = false
    },
    addDepot() {
      this.$refs.depotModalForm.add()
      this.$refs.depotModalForm.title = i18n.t('title.addDepot')
      this.$refs.depotModalForm.disableSubmit = false
    },
    addAccount() {
      this.$refs.accountModalForm.add()
      this.$refs.accountModalForm.title = i18n.t('title.addAccount')
      this.$refs.accountModalForm.disableSubmit = false
    },
    vendorModalFormOk() {
      this.initSupplier(1)
    },
    customerModalFormOk() {
      this.initCustomer(1)
    },
    memberModalFormOk() {
      this.initRetail(1)
    },
    batchSetDepotModalFormOk(depotId) {
      this.getAllTable().then(tables => {
        return getListData(this.form, tables)
      }).then(allValues => {
        //获取单据明细列表信息
        let detailArr = allValues.tablesValue[0].values
        let barCodes = ''
        for (let detail of detailArr) {
          barCodes += detail.barCode + ','
        }
        if (barCodes) {
          barCodes = barCodes.substring(0, barCodes.length - 1)
        }
        let param = {
          barCode: barCodes,
          organId: this.form.getFieldValue('organId'),
          depotId: depotId,
          mpList: getMpListShort(Vue.ls.get('materialPropertyList')),  //扩展属性
          prefixNo: this.prefixNo
        }
        getMaterialByBarCode(param).then((res) => {
          if (res && res.code === 200) {
            let mList = res.data
            //构造新的列表数组，用于存放单据明细信息
            let newDetailArr = []
            if (mList && mList.length) {
              for (let i = 0; i < detailArr.length; i++) {
                let item = detailArr[i]
                item.depotId = depotId
                for (let j = 0; j < mList.length; j++) {
                  if (mList[j].mBarCode === item.barCode) {
                    item.stock = mList[j].stock
                  }
                }
                newDetailArr.push(item)
              }
            } else {
              for (let i = 0; i < detailArr.length; i++) {
                let item = detailArr[i]
                item.depotId = depotId
                newDetailArr.push(item)
              }
            }
            this.materialTable.dataSource = newDetailArr
          }
        })
      })
    },
    depotModalFormOk() {

      this.initDepot()
    },
    accountModalFormOk() {
      this.initAccount(1)
    },
    workflowModalFormOk() {
      this.close()
    },
    onAdded(event) {
      let that = this
      const { row, target } = event
      target.setValues([{rowKey: row.id, values: {operNumber: 0}}])
      //自动下滑到最后一行
      setTimeout(function () {
        that.$refs.materialDataTable.resetScrollTop((target.rows.length + 1) * that.$refs.materialDataTable.rowHeight)
      }, 1000)
      if (this.currentSelectDepotId) {
        //如果单据选择过仓库，则直接从当前选择的仓库加载
        target.setValues([{rowKey: row.id, values: {depotId: this.currentSelectDepotId}}])
      } else {
        getAction('/depot/findDepotByCurrentUser').then((res) => {
          if (res.code === 200) {
            let arr = res.data
            if (arr.length === 1) {
              target.setValues([{rowKey: row.id, values: {depotId: arr[0].id + ''}}])
            } else {
              for (let i = 0; i < arr.length; i++) {
                if (arr[i].isDefault) {
                  target.setValues([{rowKey: row.id, values: {depotId: arr[i].id + ''}}])
                }
              }
            }
          }
        })
      }
    },
    //可编辑table 单元值改变一个字符就触发一次
    onValueChange(event) {
      let that = this
      const { type, row, column, value, target } = event
      let param, snList, batchNumber, operNumber, unitPrice, allPrice, taxRate, taxMoney, taxLastMoney
      switch (column.key) {
        case 'depotId':
          that.currentSelectDepotId = row.depotId
          if (row.barCode) {
            that.getStockByDepotBarCode(row, target)
          }
          break
        case 'barCode':
          param = {
            barCode: value,
            organId: this.form.getFieldValue('organId'),
            mpList: getMpListShort(Vue.ls.get('materialPropertyList')),  //扩展属性
            prefixNo: this.prefixNo
          }
          getMaterialByBarCode(param).then((res) => {
            if (res && res.code === 200) {
              let mList = res.data
              if (value.indexOf(',') > -1) {
                //多个条码
                this.$refs.materialDataTable.getValues((error, values) => {
                  values.pop()  //移除最后一行数据
                  let mArr = values
                  for (let i = 0; i < mList.length; i++) {
                    let mInfo = mList[i]
                    this.changeColumnShow(mInfo)
                    let mObj = this.parseInfoToObj(mInfo)
                    mObj.depotId = mInfo.depotId
                    mObj.stock = mInfo.stock
                    mArr.push(mObj)
                  }
                  let allPriceTotal = 0
                  let taxLastMoneyTotal = 0
                  for (let j = 0; j < mArr.length; j++) {
                    allPriceTotal += mArr[j].allPrice - 0
                    taxLastMoneyTotal += mArr[j].taxLastMoney - 0
                    //组合和拆分单据给商品类型进行重新赋值
                    if (j === 0) {
                      mArr[0].mType = '组合件'
                    } else {
                      mArr[j].mType = '普通子件'
                    }
                  }
                  this.materialTable.dataSource = mArr
                  if (this.prefixNo === 'LSCK' || this.prefixNo === 'LSTH' || this.prefixNo === 'DB' || this.prefixNo === 'DU' || this.prefixNo === 'XSDD') {
                    target.statisticsColumns.allPrice = allPriceTotal
                  } else {
                    target.statisticsColumns.taxLastMoney = taxLastMoneyTotal
                  }
                  that.autoChangePrice(target)
                  //强制渲染
                  target.$forceUpdate()
                })
              } else {
                //单个条码
                let depotIdSelected = this.prefixNo !== 'CGDD' && this.prefixNo !== 'XSDD' ? row.depotId : ''
                findStockByDepotAndBarCode({depotId: depotIdSelected, barCode: row.barCode}).then((res) => {
                  if (res && res.code === 200) {
                    let mArr = []
                    let mInfo = mList[0]
                    this.changeColumnShow(mInfo)
                    let mInfoEx = this.parseInfoToObj(mInfo)
                    mInfoEx.stock = res.data.stock
                    let mObj = {
                      rowKey: row.id,
                      values: mInfoEx
                    }
                    mArr.push(mObj)
                    target.setValues(mArr)
                    target.recalcAllStatisticsColumns()
                    that.autoChangePrice(target)
                    target.autoSelectBySpecialKey('operNumber', row.orderNum)
                    //强制渲染
                    target.$forceUpdate()
                  }
                })
              }
            }
          })
          break
        case 'snList':
          snList = value
          if (snList) {
            snList = snList.replaceAll('，', ',')
            let snArr = snList.split(',')
            operNumber = snArr.length
            taxRate = row.taxRate - 0 //税率
            unitPrice = row.unitPrice - 0 //单价
            allPrice = (unitPrice * operNumber).toFixed(2) - 0
            taxMoney = ((taxRate * 0.01) * allPrice).toFixed(2) - 0
            taxLastMoney = (allPrice + taxMoney).toFixed(2) - 0
            target.setValues([{
              rowKey: row.id,
              values: {operNumber: operNumber, allPrice: allPrice, taxMoney: taxMoney, taxLastMoney: taxLastMoney}
            }])
            target.recalcAllStatisticsColumns()
            that.autoChangePrice(target)
          }
          break
        case 'batchNumber':
          batchNumber = value
          let depotItemId = ''
          let rowId = row.id
          if (rowId.length <= 19) {
            depotItemId = rowId - 0
          }
          getBatchNumberList({
            name: '',
            depotItemId: depotItemId,
            depotId: row.depotId,
            barCode: row.barCode,
            batchNumber: batchNumber
          }).then((res) => {
            if (res && res.code === 200) {
              if (res.data && res.data.rows) {
                let info = res.data.rows[0]
                operNumber = info.totalNum
                taxRate = row.taxRate - 0 //税率
                unitPrice = row.unitPrice - 0 //单价
                allPrice = (unitPrice * operNumber).toFixed(2) - 0
                taxMoney = ((taxRate * 0.01) * allPrice).toFixed(2) - 0
                taxLastMoney = (allPrice + taxMoney).toFixed(2) - 0
                target.setValues([{
                  rowKey: row.id, values: {
                    expirationDate: info.expirationDateStr, operNumber: operNumber,
                    allPrice: allPrice, taxMoney: taxMoney, taxLastMoney: taxLastMoney
                  }
                }])
                target.recalcAllStatisticsColumns()
                that.autoChangePrice(target)
              }
            }
          })
          break
        case 'operNumber':
          operNumber = value - 0
          //taxRate = row.taxRate - 0 //税率
          taxRate = 0
          unitPrice = row.unitPrice - 0 //单价
          allPrice = (unitPrice * operNumber).toFixed(2) - 0
          taxMoney = ((taxRate * 0.01) * allPrice).toFixed(2) - 0
          taxLastMoney = (allPrice + taxMoney).toFixed(2) - 0
          target.setValues([{
            rowKey: row.id,
            values: {allPrice: allPrice, taxMoney: taxMoney, taxLastMoney: taxLastMoney}
          }])

          target.setValues([{rowKey: row.id, values: {discountMoney: taxLastMoney}}])

          target.recalcAllStatisticsColumns()
          that.autoChangePrice(target)
          break
        case 'unitPrice':
          operNumber = row.operNumber - 0 //数量
          unitPrice = value - 0 //单价
          //taxRate = row.taxRate - 0 //税率
          taxRate = 0
          allPrice = (unitPrice * operNumber).toFixed(2) - 0
          taxMoney = ((taxRate * 0.01) * allPrice).toFixed(2) - 0
          taxLastMoney = (allPrice + taxMoney).toFixed(2) - 0
          target.setValues([{
            rowKey: row.id,
            values: {allPrice: allPrice, taxMoney: taxMoney, taxLastMoney: taxLastMoney, discountMoney: taxLastMoney}
          }])
          target.recalcAllStatisticsColumns()
          that.autoChangePrice(target)
          break
        case 'allPrice':
          operNumber = row.operNumber - 0 //数量
          //taxRate = row.taxRate - 0 //税率
          taxRate = 0
          allPrice = value - 0
          unitPrice = (allPrice / operNumber).toFixed(2) - 0 //单价
          taxMoney = ((taxRate * 0.01) * allPrice).toFixed(2) - 0
          taxLastMoney = (allPrice + taxMoney).toFixed(2) - 0
          target.setValues([{
            rowKey: row.id,
            values: {unitPrice: unitPrice, taxMoney: taxMoney, taxLastMoney: taxLastMoney}
          }])
          target.recalcAllStatisticsColumns()
          that.autoChangePrice(target)
          break
        case 'taxRate':
          operNumber = row.operNumber - 0 //数量
          allPrice = row.allPrice - 0
          unitPrice = row.unitPrice - 0
          taxRate = value - 0 //税率
          taxMoney = ((taxRate * 0.01) * allPrice).toFixed(2) - 0
          taxLastMoney = (allPrice + taxMoney).toFixed(2) - 0
          target.setValues([{rowKey: row.id, values: {taxMoney: taxMoney, taxLastMoney: taxLastMoney}}])
          target.recalcAllStatisticsColumns()
          that.autoChangePrice(target)
          break
        case 'taxLastMoney':
          operNumber = row.operNumber - 0 //数量
          taxLastMoney = value - 0
          taxRate = row.taxRate - 0 //税率
          unitPrice = (taxLastMoney / operNumber / (1 + taxRate * 0.01)).toFixed(2) - 0
          allPrice = (unitPrice * operNumber).toFixed(2) - 0
          taxMoney = (taxLastMoney - allPrice).toFixed(2) - 0
          target.setValues([{rowKey: row.id, values: {unitPrice: unitPrice, allPrice: allPrice, taxMoney: taxMoney}}])
          target.recalcAllStatisticsColumns()
          that.autoChangePrice(target)
          break

        case 'discount':
          // 根据优惠率计算优惠后金额
          const discountValue = value - 0 // 优惠率
          const allPrice2 = row.allPrice - 0 // 价税合计
          // 计算优惠后金额 = 价税合计 * (1 - 优惠率百分比)
          const discountMoneyValue = (allPrice2 * (1 - discountValue / 100)).toFixed(2) - 0
          target.setValues([{rowKey: row.id, values: {discountMoney: discountMoneyValue}}])
          target.recalcAllStatisticsColumns()
          // that.itemDiscountChange(target)
          break

        case 'discountMoney':
          // 根据优惠后金额计算优惠率
          const discountMoneyVal = value - 0 // 优惠后金额
          const allPrice1 = row.allPrice - 0 // 价税合计
          if (allPrice1 > 0) {
            // 计算优惠率 = (1 - 优惠后金额 / 价税合计) * 100
            const discountVal = ((1 - discountMoneyVal / allPrice1) * 100).toFixed(2) - 0
            target.setValues([{rowKey: row.id, values: {discount: discountVal}}])
          }
          target.recalcAllStatisticsColumns()
          // that.itemDiscountChange(target)
          break
      }
    },
    //转为商品对象
    parseInfoToObj(mInfo) {
      return {
        barCode: mInfo.mBarCode,
        name: mInfo.name,
        standard: mInfo.standard,
        model: mInfo.model,
        color: mInfo.color,
        materialOther: mInfo.materialOther,
        unit: mInfo.commodityUnit,
        sku: mInfo.sku,
        operNumber: 1,
        unitPrice: mInfo.billPrice,
        allPrice: mInfo.billPrice,
        taxRate: 0,
        taxMoney: 0,
        taxLastMoney: mInfo.billPrice,
        discount: 0,
        discountMoney: mInfo.billPrice
      }
    },
    //使得型号、颜色、扩展信息、sku等为隐藏
    changeColumnHide() {
      this.changeFormTypes(this.materialTable.columns, 'model', 0)
      this.changeFormTypes(this.materialTable.columns, 'color', 0)
      this.changeFormTypes(this.materialTable.columns, 'materialOther', 0)
      this.changeFormTypes(this.materialTable.columns, 'sku', 0)
    },
    //使得sku、序列号、批号、到期日等为显示
    changeColumnShow(info) {
      if (info.model) {
        this.changeFormTypes(this.materialTable.columns, 'model', 1)
      }
      if (info.color) {
        this.changeFormTypes(this.materialTable.columns, 'color', 1)
      }
      if (info.materialOther) {
        this.changeFormTypes(this.materialTable.columns, 'materialOther', 1)
      }
      if (info.sku) {
        this.changeFormTypes(this.materialTable.columns, 'sku', 1)
      }
      if (info.enableSerialNumber === '1') {
        //如果开启出入库管理，并且类型等于采购、采购退货、销售、销售退货，则跳过
        if (this.inOutManageFlag && (this.prefixNo === 'CGRK' || this.prefixNo === 'CGTH' || this.prefixNo === 'DB' || this.prefixNo === 'XSTH')) {
          //跳过
        } else {
          this.changeFormTypes(this.materialTable.columns, 'snList', 1)
        }
      }
      if (info.enableBatchNumber === '1') {
        //如果开启出入库管理，并且类型等于采购、采购退货、销售、销售退货，则跳过
        if (this.inOutManageFlag && (this.prefixNo === 'CGRK' || this.prefixNo === 'CGTH' || this.prefixNo === 'DB' || this.prefixNo === 'XSTH')) {
          //跳过
        } else {
          this.changeFormTypes(this.materialTable.columns, 'batchNumber', 1)
          this.changeFormTypes(this.materialTable.columns, 'expirationDate', 1)
        }
      }
    },
    //删除一行或多行的时候触发
    onDeleted(ids, target) {
      target.recalcAllStatisticsColumns()
      this.autoChangePrice(target)
    },
    //根据仓库和条码查询库存
    getStockByDepotBarCode(row, target) {
      findStockByDepotAndBarCode({ depotId: row.depotId, barCode: row.barCode }).then((res) => {
        if (res && res.code === 200) {
          target.setValues([{rowKey: row.id, values: {stock: res.data.stock}}])
          target.recalcAllStatisticsColumns()
        }
      })
    },
    //改变单个商品优惠率和优惠后金额
    itemDiscountChange(target) {
      let allTaxLastMoney = target.statisticsColumns.taxLastMoney - 0
      let afterDiscount = target.statisticsColumns.discountMoney

      let discountLastMoney = afterDiscount
      let discountMoney = allTaxLastMoney - discountLastMoney
      let discount = ((discountMoney / allTaxLastMoney) * 100).toFixed(2) - 0
      this.$nextTick(() => {
        this.form.setFieldsValue({
          'discount': discount,
          'discountMoney': discountMoney,
          'discountLastMoney': discountLastMoney
        })
      })
    },
    //改变优惠、本次付款、欠款的值
    autoChangePrice(target) {
      let allTaxLastMoney = target.statisticsColumns.allPrice - 0
      let discount = this.form.getFieldValue('discount') - 0
      let otherMoney = this.form.getFieldValue('otherMoney') ? this.form.getFieldValue('otherMoney') - 0 : 0
      let deposit = this.form.getFieldValue('deposit') - 0
      let discountLastMoney = (allTaxLastMoney * (1 - discount / 100)).toFixed(2) - 0
      let discountMoney = allTaxLastMoney - discountLastMoney
      let changeAmountNew = (discountLastMoney + otherMoney).toFixed(2) - 0
      if (deposit) {
        changeAmountNew = (changeAmountNew - deposit).toFixed(2) - 0
      }
      this.$nextTick(() => {
        changeAmountNew = this.prefixNo === 'CGDD' || this.prefixNo === 'XSDD' ? 0 : changeAmountNew
        this.form.setFieldsValue({
          'discount': discount, 'discountMoney': discountMoney, 'discountLastMoney': discountLastMoney,
          'changeAmount': changeAmountNew, 'debt': 0
        })
      })
    },
    //改变优惠率
    onChangeDiscount(e) {
      const value = e.target.value - 0
      let otherMoney = this.form.getFieldValue('otherMoney') ? this.form.getFieldValue('otherMoney') - 0 : 0
      let deposit = this.form.getFieldValue('deposit')
      let allTaxLastMoney = this.$refs.materialDataTable.statisticsColumns.taxLastMoney - 0
      let discountLastMoneyNew = (allTaxLastMoney * (1 - value / 100)).toFixed(2) - 0
      let discountMoneyNew = allTaxLastMoney - discountLastMoneyNew

      let changeAmountNew = (discountLastMoneyNew + otherMoney).toFixed(2) - 0
      if (deposit) {
        changeAmountNew = (changeAmountNew - deposit).toFixed(2) - 0
      }
      this.$nextTick(() => {
        changeAmountNew = this.prefixNo === 'CGDD' || this.prefixNo === 'XSDD' ? 0 : changeAmountNew
        this.form.setFieldsValue({
          'discountMoney': discountMoneyNew, 'discountLastMoney': discountLastMoneyNew,
          'changeAmount': changeAmountNew, 'debt': 0
        })
      })
    },
    //改变销售优惠率
    onSaleChangeDiscount(e) {
      const value = e.target.value - 0
      let otherMoney = this.form.getFieldValue('otherMoney') ? this.form.getFieldValue('otherMoney') - 0 : 0
      let deposit = this.form.getFieldValue('deposit')
      let taxMoney = (this.form.getFieldValue('taxMoney') - 0) || 0
      let discountMoney = this.$refs.materialDataTable.statisticsColumns.allPrice - 0
      //优惠后金额（无税率）
      let discountLastMoneyNew = (discountMoney * (1 - value / 100)).toFixed(2) - 0
      let discountLastMoneyBack = discountLastMoneyNew;
      //实际优惠后 =  优惠后 * （1 + 税率）
      discountLastMoneyNew = (discountLastMoneyNew * (1 + taxMoney / 100)).toFixed(2) - 0
      //优惠金额
      let discountMoneyNew = discountMoney - discountLastMoneyNew

      let changeAmountNew = (discountLastMoneyNew + otherMoney).toFixed(2) - 0
      if (deposit) {
        changeAmountNew = (changeAmountNew - deposit).toFixed(2) - 0
      }

      this.$nextTick(() => {
        changeAmountNew = this.prefixNo === 'CGDD' || this.prefixNo === 'XSDD' ? 0 : changeAmountNew
        this.form.setFieldsValue({
          'discountMoney': discountMoneyNew, 'discountLastMoney': (discountLastMoneyNew - 0) + (taxMoney - 0),
          'changeAmount': changeAmountNew,
          'debt': 0,
          'taxValue': (discountLastMoneyBack * taxMoney / 100).toFixed(2) - 0
        })
      })
    },
    // 当税率变化时更新优惠后金额
    onChangeSaleTaxMoney(e) {
      let taxMoney = e.target.value
      // 如果输入为空，则设为0
      if (taxMoney === '' || taxMoney === null || taxMoney === undefined) {
        taxMoney = 0
        this.$nextTick(() => {
          this.form.setFieldsValue({'taxMoney': taxMoney})
          this.form.setFieldsValue({'taxValue': taxMoney})
        })
      } else {
        taxMoney = taxMoney - 0
      }
      const discount = this.form.getFieldValue('discount')
      let otherMoney = this.form.getFieldValue('otherMoney') ? this.form.getFieldValue('otherMoney') - 0 : 0
      let deposit = this.form.getFieldValue('deposit')
      let discountMoney = this.$refs.materialDataTable.statisticsColumns.discountMoney - 0;
      if (isNaN(discountMoney)) {
        discountMoney = this.$refs.materialDataTable.statisticsColumns.allPrice - 0;
      }
      //优惠后金额
      let discountLastMoneyNew = (discountMoney * (1 - discount / 100)).toFixed(2) - 0
      //优惠金额
      let discountMoneyNew = Math.round((discountMoney - discountLastMoneyNew) * 100) / 100
      let discountLastMoney = ((discountLastMoneyNew - 0) * (1 + taxMoney / 100)).toFixed(2) - 0
      let changeAmountNew = (discountLastMoney + otherMoney).toFixed(2) - 0
      if (deposit) {
        changeAmountNew = (changeAmountNew - deposit).toFixed(2) - 0
      }

      this.$nextTick(() => {
        changeAmountNew = this.prefixNo === 'CGDD' || this.prefixNo === 'XSDD' ? 0 : changeAmountNew
        this.form.setFieldsValue({
          'discountMoney': discountMoneyNew, 'discountLastMoney': discountLastMoney,
          'changeAmount': changeAmountNew,
          'debt': 0,
          'taxValue': (discountLastMoney - discountLastMoneyNew).toFixed(2) - 0
        })
      })
    },
    //改变优惠后金额
    onChangeDiscountMoney(e) {
      const value = e.target.value - 0
      let otherMoney = this.form.getFieldValue('otherMoney') ? this.form.getFieldValue('otherMoney') - 0 : 0
      let deposit = this.form.getFieldValue('deposit')
      let allTaxLastMoney = this.$refs.materialDataTable.statisticsColumns.taxLastMoney - 0
      let discountNew = ((1 - value / allTaxLastMoney) * 100).toFixed(2) - 0
      let discountLastMoneyNew = (allTaxLastMoney - value).toFixed(2) - 0
      let changeAmountNew = (discountLastMoneyNew + otherMoney).toFixed(2) - 0
      if (deposit) {
        changeAmountNew = (changeAmountNew - deposit).toFixed(2) - 0
      }
      // this.$nextTick(() => {
      //   changeAmountNew = this.prefixNo === 'CGDD' || this.prefixNo === 'XSDD'?0:changeAmountNew
      //   this.form.setFieldsValue({'discount':discountNew,'discountLastMoney':discountLastMoneyNew,
      //     'changeAmount':changeAmountNew,'debt':0})
      // });
    },
    //其它费用
    onChangeOtherMoney(e) {
      const value = e.target.value - 0
      let discountLastMoney = this.form.getFieldValue('discountLastMoney') - 0
      let deposit = this.form.getFieldValue('deposit')
      let changeAmountNew = (discountLastMoney + value).toFixed(2) - 0
      if (deposit) {
        changeAmountNew = (changeAmountNew - deposit).toFixed(2) - 0
      }
      this.$nextTick(() => {
        this.form.setFieldsValue({'changeAmount': changeAmountNew, 'debt': 0})
      })
    },
    //改变扣除订金
    onChangeDeposit(e) {
      const value = e.target.value - 0
      let discountLastMoney = this.form.getFieldValue('discountLastMoney') - 0
      let otherMoney = this.form.getFieldValue('otherMoney') ? this.form.getFieldValue('otherMoney') - 0 : 0
      let changeAmountNew = (discountLastMoney + otherMoney).toFixed(2) - 0
      if (value) {
        changeAmountNew = (changeAmountNew - value).toFixed(2) - 0
      }
      this.$nextTick(() => {
        this.form.setFieldsValue({'changeAmount': changeAmountNew, 'debt': 0})
      })
    },
    //改变本次付款
    onChangeChangeAmount(e) {
      const value = e.target.value - 0
      let discountLastMoney = this.form.getFieldValue('discountLastMoney') - 0
      let otherMoney = this.form.getFieldValue('otherMoney') ? this.form.getFieldValue('otherMoney') - 0 : 0
      let deposit = this.form.getFieldValue('deposit')
      let debtNew = (discountLastMoney + otherMoney - value).toFixed(2) - 0
      if (deposit) {
        debtNew = (debtNew - deposit).toFixed(2) - 0
      }
      this.$nextTick(() => {
        this.form.setFieldsValue({'debt': debtNew})
      })
    },
    //切换客户信息改变商品单价
    handleOrganChange(value) {
      let organId = value
      this.getAllTable().then(tables => {
        return getListData(this.form, tables)
      }).then(allValues => {
        let detailArr = allValues.tablesValue[0].values
        let barCodeStr = ''
        for (let detail of detailArr) {
          if (detail.barCode) {
            barCodeStr += detail.barCode + ','
          }
        }
        if (barCodeStr) {
          let param = {
            barCode: barCodeStr,
            organId: organId,
            mpList: getMpListShort(Vue.ls.get('materialPropertyList')),  //扩展属性
            prefixNo: this.prefixNo
          }
          getMaterialByBarCode(param).then((res) => {
            if (res && res.code === 200) {
              let allLastMoney = 0
              let allTaxLastMoney = 0
              //获取单据明细列表信息
              let detailArr = allValues.tablesValue[0].values
              //构造新的列表数组，用于存放单据明细信息
              let newDetailArr = []
              for (let detail of detailArr) {
                if (detail.barCode) {
                  //如果条码重复，就在给原来的数量加1
                  let mList = res.data
                  for (let i = 0; i < mList.length; i++) {
                    if (detail.barCode === mList[i].mBarCode) {
                      //由于改变了商品单价，需要同时更新相关金额和价税合计
                      let taxRate = detail.taxRate - 0 //税率
                      detail.unitPrice = mList[i].billPrice - 0 //单价
                      detail.allPrice = (detail.unitPrice * detail.operNumber).toFixed(2) - 0
                      detail.taxMoney = ((taxRate * 0.01) * detail.allPrice).toFixed(2) - 0
                      detail.taxLastMoney = (detail.allPrice + detail.taxMoney).toFixed(2) - 0
                    }
                  }
                  newDetailArr.push(detail)
                }
              }
              this.materialTable.dataSource = newDetailArr
              //更新优惠后金额、本次付款等信息
              for (let newDetail of newDetailArr) {
                allLastMoney = allLastMoney + (newDetail.allPrice - 0)
                allTaxLastMoney = allTaxLastMoney + (newDetail.taxLastMoney - 0)
              }
              let discount = this.form.getFieldValue('discount') - 0
              let otherMoney = this.form.getFieldValue('otherMoney') ? this.form.getFieldValue('otherMoney') - 0 : 0
              let deposit = this.form.getFieldValue('deposit')
              let discountMoney = (discount * 0.01 * allTaxLastMoney).toFixed(2) - 0
              let discountLastMoney = (allTaxLastMoney - discountMoney).toFixed(2) - 0
              let changeAmountNew = (discountLastMoney + otherMoney).toFixed(2) - 0
              if (deposit) {
                changeAmountNew = (changeAmountNew - deposit).toFixed(2) - 0
              }
              this.$nextTick(() => {
                changeAmountNew = this.prefixNo === 'XSDD' ? 0 : changeAmountNew
                this.form.setFieldsValue({
                  'discount': discount, 'discountMoney': discountMoney, 'discountLastMoney': discountLastMoney,
                  'changeAmount': changeAmountNew, 'debt': 0
                })
              })
            }
          })
        }
      })
    },
    scanEnter() {
      this.scanStatus = false
      this.$nextTick(() => {
        this.$refs.scanBarCode.focus()
      })
    },
    //扫码之后回车
    scanPressEnter() {
      let that = this
      if (this.scanBarCode) {
        this.getAllTable().then(tables => {
          return getListData(this.form, tables)
        }).then(allValues => {
          let param = {
            barCode: this.scanBarCode.trim(),
            organId: this.form.getFieldValue('organId'),
            mpList: getMpListShort(Vue.ls.get('materialPropertyList')),  //扩展属性
            prefixNo: this.prefixNo
          }
          getMaterialByBarCode(param).then((res) => {
            if (res && res.code === 200) {
              let hasFinished = false
              let allLastMoney = 0
              let allTaxLastMoney = 0
              //获取单据明细列表信息
              let detailArr = allValues.tablesValue[0].values
              //构造新的列表数组，用于存放单据明细信息
              let newDetailArr = []
              let hasAdd = false
              for (let detail of detailArr) {
                if (detail.barCode) {
                  //如果扫码结果和条码重复，就在给原来的数量加1
                  if (detail.barCode === this.scanBarCode.trim() && !hasAdd) {
                    detail.operNumber = (detail.operNumber - 0) + 1
                    //由于改变了商品数量，需要同时更新相关金额和价税合计
                    let taxRate = detail.taxRate - 0 //税率
                    let unitPrice = detail.unitPrice - 0 //单价
                    detail.allPrice = (unitPrice * detail.operNumber).toFixed(2) - 0
                    detail.taxMoney = ((taxRate * 0.01) * detail.allPrice).toFixed(2) - 0
                    detail.taxLastMoney = (detail.allPrice + detail.taxMoney).toFixed(2) - 0
                    hasFinished = true
                    hasAdd = true
                  }
                  //如果扫码结果和序列号重复，就直接跳过
                  if (detail.snList === this.scanBarCode.trim()) {
                    this.$message.warning(i18n.t('message.hasScanned'))
                    hasFinished = true
                  }
                  newDetailArr.push(detail)
                }
              }
              if (!hasFinished) {
                //将扫码的条码对应的商品加入列表
                let item = {}
                let mList = res.data
                if (mList && mList.length > 0) {
                  let mInfo = mList[0]
                  this.changeColumnShow(mInfo)
                  item.depotId = mInfo.depotId
                  item.barCode = mInfo.mBarCode
                  item.name = mInfo.name
                  item.standard = mInfo.standard
                  item.model = mInfo.model
                  item.color = mInfo.color
                  item.materialOther = mInfo.materialOther
                  item.stock = mInfo.stock
                  item.unit = mInfo.commodityUnit
                  item.sku = mInfo.sku
                  if (mInfo.mBarCode !== this.scanBarCode.trim()) {
                    if (this.prefixNo === 'LSCK' || this.prefixNo === 'CGTH' || this.prefixNo === 'DB' || this.prefixNo === 'QTCK') {
                      //此时给序列号赋值
                      item.snList = this.scanBarCode.trim()
                    }
                  }
                  item.operNumber = 1
                  item.unitPrice = mInfo.billPrice
                  item.allPrice = mInfo.billPrice
                  item.taxRate = 0
                  item.taxMoney = 0
                  item.taxLastMoney = mInfo.billPrice
                  newDetailArr.push(item)
                } else {
                  this.$message.warning(i18n.t('message.noProduct'))
                }
              }
              //组合和拆分单据给商品类型进行重新赋值
              for (let i = 0; i < newDetailArr.length; i++) {
                if (i === 0) {
                  newDetailArr[0].mType = '组合件'
                } else {
                  newDetailArr[i].mType = '普通子件'
                }
              }
              this.materialTable.dataSource = newDetailArr
              //更新优惠后金额、本次付款等信息
              for (let newDetail of newDetailArr) {
                allLastMoney = allLastMoney + (newDetail.allPrice - 0)
                allTaxLastMoney = allTaxLastMoney + (newDetail.taxLastMoney - 0)
              }
              let discount = this.form.getFieldValue('discount') - 0
              let otherMoney = this.form.getFieldValue('otherMoney') ? this.form.getFieldValue('otherMoney') - 0 : 0
              let deposit = this.form.getFieldValue('deposit')
              let discountMoney = (discount * 0.01 * allTaxLastMoney).toFixed(2) - 0
              let discountLastMoney = (allTaxLastMoney - discountMoney).toFixed(2) - 0
              let changeAmountNew = (discountLastMoney + otherMoney).toFixed(2) - 0
              if (deposit) {
                changeAmountNew = (changeAmountNew - deposit).toFixed(2) - 0
              }
              if (this.prefixNo === 'LSCK' || this.prefixNo === 'LSTH') {
                this.$nextTick(() => {
                  this.form.setFieldsValue({'changeAmount': allLastMoney, 'getAmount': allLastMoney, 'backAmount': 0})
                })
              } else {
                this.$nextTick(() => {
                  changeAmountNew = this.prefixNo === 'CGDD' || this.prefixNo === 'XSDD' ? 0 : changeAmountNew
                  this.form.setFieldsValue({
                    'discount': discount, 'discountMoney': discountMoney, 'discountLastMoney': discountLastMoney,
                    'changeAmount': changeAmountNew, 'debt': 0
                  })
                })
              }
              //置空扫码的内容
              this.scanBarCode = ''
              this.$refs.scanBarCode.focus()
              //自动下滑到最后一行
              setTimeout(function () {
                that.$refs.materialDataTable.resetScrollTop((newDetailArr.length + 1) * that.$refs.materialDataTable.rowHeight)
              }, 1000)
            }
          })
        })
      }
    },
    stopScan() {
      this.scanStatus = true
      this.scanBarCode = ''
    },
    onImport(prefixNo) {
      this.$refs.importItemModalForm.add(prefixNo)
    },
    importItemModalFormOk(data) {
      this.materialTable.dataSource = data
      this.$nextTick(() => {
        let discountLastMoney = 0
        for (let i = 0; i < data.length; i++) {
          discountLastMoney += data[i].taxLastMoney
          this.changeColumnShow(data[i])
        }
        this.form.setFieldsValue({'discountLastMoney': discountLastMoney})
      })
    },
    //保存并审核，仓库出库名称改为保存并出库
    handleOkAndCheck() {
      this.billStatus = 1
      //销售订单是提交审批流，其余直接审核成功
      if (this.prefixNo === 'XSDD') {
        this.billStatus = 9
      }
      this.handleOk()
    },
    //发起流程
    handleWorkflow() {
      if (this.model && this.model.number) {
        getPlatformConfigByKey({'platformKey': 'send_workflow_url'}).then((res) => {
          if (res && res.code === 200) {
            let sendWorkflowUrl = res.data.platformValue + '?no=' + this.model.number + '&type=1'
            this.$refs.modalWorkflow.show(this.model, sendWorkflowUrl, this.model.number, 1, 320)
            this.$refs.modalWorkflow.title = i18n.t('title.startProcess')
          }
        })
      } else {
        this.$message.warning(i18n.t('message.pleaseSaveBill'))
      }
    },
    //三联打印预览
    handlePrint(billType) {
      if (this.model.id) {
        getPlatformConfigByKey({'platformKey': 'bill_print_url'}).then((res) => {
          if (res && res.code === 200) {
            let billPrintUrl = res.data.platformValue + '?no=' + this.model.number
            let billPrintHeight = this.materialTable.dataSource.length * 50 + 600
            this.$refs.modalPrint.show(this.model, billPrintUrl, billPrintHeight)
            this.$refs.modalPrint.title = billType + '-' + i18n.t('title.threeLinkPrintPreview')
          }
        })
      } else {
        this.$message.warning(i18n.t('message.pleaseSaveBill'))
      }
    },
    //加载平台配置信息
    initPlatform() {
      getPlatformConfigByKey({'platformKey': 'bill_print_flag'}).then((res) => {
        if (res && res.code === 200) {
          this.billPrintFlag = res.data.platformValue === '1' ? true : false
        }
      })
    }
  }
}